<?php
namespace app\common\model;
class Weixinlogs extends Base{
    /**
     * 用于前端聊天组件获取聊天信息
     * @param  array  $where [description]
     * @return [type]        [description]
     */
    function logs($where=[],$offset=0,$append=false){
    	$options=[
    		'field'=>'*',
    		'order'=>'id desc',
    	];
        $list=[];
        if($append){
            $list=$this->where($where)->order($options['order'])->field($options['field'])->select()->toArray();
        }else{
            $list=$this->where($where)->order($options['order'])->field($options['field'])->limit($offset,config('paginate.list_rows'))->select()->toArray();
        }
        
        // 设置已读
        $ids=[];
        foreach ($list as $k => $v) {
            if($v['unread']){
                $ids[]=['id'=>$v['id'],'unread'=>0];
            }
        }
        if(!empty($ids)){
            $this->edit($ids);
        }
        // 做个排序
        usort($list,function($a,$b){
            return $a['id']>$b['id'];
        }); 
		return $list;
    }
    /**
     * 用户好友存在未读信息ID组以及未读数量
     * @param  integer $uid 用户ID
     * @return [type]      [description]
     */
    function unreadIds($uid){
        $where=[
            'member_id'=>$uid,
            'unread'=>1,
        ];
        $options=[
            'field'=>'social_id,soft_id'
        ];
        $list=$this->readAll($where,0,$options);
        $ids=[];
        foreach ($list as $v) {
            $key=$v['soft_id'].'_'.$v['social_id'];
            if(isset($ids[$key])){
                $ids[$key]++;
            }else{
                $ids[$key]=1;
            }
        }
        return $ids;
    }
    /**
     * 通过设备ID获取任务列表
     * @param  [type] $dev_id [description]
     * @return [type]         [description]
     */
    function getUnsendByDevId($dev_id,$where=[]){
        $map=[
            'dev_id'=>$dev_id,
        ];
        $map=array_merge($map,$where);
        $options=[
            'field'=>'*,content as wxMsg',
            'with'=>['software','social']
        ];
        $list=$this->readAll($map,0,$options)->toArray();
        return $list;
    }
    /**
     * 创建微信消息扩展任务
     * @param  array $wxMsg [description]
     * @param  integer $isGroup 0:发给好友 1：发给群组
     * @return array
     */
    function createWxMsgTask($wxMsg,$isGroup=0){
        $social=model('social')->read(['id'=>$wxMsg['social_id']],'id,number,name');
        $data=[
            'member_id'=>$wxMsg['member_id'],
            'title'=>'发送微信消息',
            'msg'=>$wxMsg['media_id']>0?'':$wxMsg['content'],
            'interval'=>0,
            'event'=>'extraTask',
            'dev'=>[$wxMsg['dev_id']],
            'software'=>[$wxMsg['soft_id']],
            's_time'=>$wxMsg['send_time'],
            'type'=>1,
            'action'=>2,
            'loop'=>0, // 是否循环请求
            'start_time'=>$wxMsg['send_time'],
            'status'=>1,
            'remark'=>'(扩展任务)发送微信消息',
            'options'=>[
                'friends'=>0, // 发送好友
                'group'=>$isGroup, // 发送群组
                'interval'=>0, // 发送间隔
                'sex'=>2, // 性别筛选 0：女 1：男 2：所有
                'number'=>[], // 微信号、QQ号、手机号
                'count'=>0, // 操作数量限制0表示不限制 例：同意好友添加请求 10 个
                'limit'=>100, // 默认设置:100 例：点赞 100 个
                'sign'=>[], // 个性签名(一个数组 多行随机抽取)
                'msg'=>[], // 加好友时的打招呼信息(一个数组 多行随机抽取)
                'nickname'=>[$social['name']], //好友的昵称
                'wxId'=>$social['number'], //好友的微信号
                'log_id'=>$wxMsg['id'], //消息队列ID，任务完成后返回
                'soft_id'=>$wxMsg['soft_id'], //当前操作的微信ID
            ]
        ];
        $field=[];
        if($wxMsg['media_id']>0){
            $field=[$wxMsg['media_id']];
        }
        // 创建任务
        $rs=controller('Weixinlogs')->createTask($data,$data['member_id'],$field);
        return $rs;
    }
    /**
     * 创建微信消息采集任务
     * @param  integer $uid    用户ID
     * @return array
     */
    function createWxMsgInfos($uid){
        $time=time();
        $data=[
            'member_id'=>$uid,
            'title'=>'采集微信消息',
            'msg'=>'',
            'interval'=>0,
            'event'=>'extraTask',
            'dev'=>[],
            's_time'=>$time,
            'type'=>1,
            'action'=>3,
            'loop'=>1, // 是否循环请求
            'runtime'=>'',
            'start_time'=>$time,
            'status'=>0,
            'remark'=>'(扩展任务)采集微信消息',
            'options'=>[
                'friends'=>0, // 发送好友
                'group'=>0, // 发送群组
                'interval'=>0, // 发送间隔
                'sex'=>2, // 性别筛选 0：女 1：男 2：所有
                'number'=>[], // 微信号、QQ号、手机号
                'count'=>0, // 操作数量限制0表示不限制 例：同意好友添加请求 10 个
                'limit'=>100, // 默认设置:100 例：点赞 100 个
                'sign'=>[], // 个性签名(一个数组 多行随机抽取)
                'msg'=>[], // 加好友时的打招呼信息(一个数组 多行随机抽取)
                
            ]
        ];
        // 创建任务
        $rs=controller('Weixinlogs')->createTask($data,$uid,[],function($task_id)use($uid){
            model('member')->edit(['id'=>$uid,'wxmsg_task_id'=>$task_id]);
        }); 
        return $rs;
    }
    /**
     * 微信消息送达通知
     * @param  [type] $data [description]
     * @param  [type] $uid  [description]
     * @return [type]       [description]
     */
    function wxMsgEnd($data,$member_id,$device_id){
        $map=[
            'member_id'=>$member_id,
            'dev_id'=>$device_id,
            'send_status'=>['send_status','<',2]
        ];
        foreach($data as $v) {
            $map['id']=$v;
            $wsMsg=$this->read($map,'id,soft_id,social_id,send_status');
            if(!empty($wsMsg)){
                $edit=$this->edit(['id'=>$v,'send_status'=>2]);
                if($edit){
                    $wsMsg['send_status']=2;
                    // 这里可通知前台发送状态
                    $this->wsMsgSendStatus($member_id,$device_id,$wsMsg);
                }
            }
        }
        
    }
    /**
     * 采集微信消息回馈通知
     * 采集消息为一条一条发送 请使用 api/weixinlogs/add() 获取
     * @param  [type] $post [description]
     * @param  [type] $uid  [description]
     * @return [type]       [description]
     */
    function wxMsgInfosEnd($post,$uid,$dev_id){
        // 设置时间 限定自动消息采集间隔
        model('device')->edit(['id'=>$dev_id,'wxmsg_etime'=>time()]);
        //p($dev_id);
    }
    // 通知后台信息发送状态
    function wsMsgSendStatus($uid,$dev_id,$wsMsg){
        $data=[
            'event'=>'wsmsg_send_status',
            'data'=>[
                'soft_id'=>$wsMsg['soft_id'],
                'social_id'=>$wsMsg['social_id'],
                'log_id'=>$wsMsg['id'],
                'send_status'=>$wsMsg['send_status'],
            ]
        ];
        \socket\Socket::admin($data,$uid,$dev_id);
    }
    // 用于 getUnsendByDevId()
    function software(){
        return $this->belongsTo('software','soft_id')->bind(['wxId'=>'number']);
    }
    // 用于 getUnsendByDevId()
    function social(){
        return $this->belongsTo('social','social_id')->bind(['social_number'=>'number','nickname'=>'name']);
    }
    
}
